#ifndef ___fat32_operacionAX_generar_entradas_para_archivo

#define ___fat32_operacionAX_generar_entradas_para_archivo 1

#include "f32_mto.c"

#include <sys/timeb.h>
#include <time.h>

struct fat32opAX_datos_creacion_entrada {
  char * nombreLargo;
  char * nombreCorto;
  unsigned char soloLectura;
};

unsigned char fat32op_generar_entradas_para_archivo(FAT32_PARAMS_OPERACION);
void fat32aop_generar_hora_creacion_archivo(char *);
void fat32aop_insertar_datos_nombre_largo_en_entrada(unsigned short int *, char *);

unsigned char fat32op_generar_entradas_para_archivo (FAT32_PARAMS_OPERACION) {
  struct fat32opAX_datos_creacion_entrada * datos = datosEntrada;
  char * entradas = NULL;
  unsigned long cantidadEntradas = 0;
  unsigned char posicion;
  char entrada[32];
  for (posicion = 12; posicion < 32; posicion ++) entrada[posicion] = 0;
  memcpy(entrada, datos -> nombreCorto, 11);
  entrada[11] = (datos -> soloLectura) ? 1 : 0;
  fat32aop_generar_hora_creacion_archivo(entrada);
  cantidadEntradas ++;
  entradas = fb_cambiar_tamano(entradas, 32, cantidadEntradas);
  memcpy(entradas, entrada, 32);
  if (!(datos -> nombreLargo)) {
    *datosSalida = entradas;
    return 1;
  }
  unsigned char checksum = 0;
  for (posicion = 0; posicion < 11; posicion ++) {
    checksum = ((checksum & 1) * 128) + (checksum / 2);
    checksum += entrada[posicion];
  }
  unsigned short int * nombre16 = fat32_convertir_utf8_a_utf16(datos -> nombreLargo);
  cantidadEntradas += (strlen16(nombre16) + 12) / 13;
  if (cantidadEntradas > 21) cantidadEntradas = 21;
  entradas = fb_cambiar_tamano(entradas, 32, cantidadEntradas);
  for (posicion = 0; posicion < (cantidadEntradas - 1); posicion ++) {
    entrada[0] = posicion + 1;
    if (posicion == (cantidadEntradas - 2)) entrada[0] += 64;
    entrada[11] = 15;
    entrada[12] = 0;
    entrada[13] = checksum;
    entrada[26] = 0;
    entrada[27] = 0;
    fat32aop_insertar_datos_nombre_largo_en_entrada(nombre16 + 13 * posicion, entrada);
    memcpy(entradas + 32 * (posicion + 1), entrada, 32);
  }
  *datosSalida = entradas;
  return cantidadEntradas;
}

void fat32aop_generar_hora_creacion_archivo (char * entrada) {
  struct timeb tb;
  ftime(&tb);
  struct tm t;
  localtime_r(&(tb.time), &t);
  unsigned short h1, h2;
  unsigned char h3;
  h1 = 0;
  h2 = 0;
  h3 = (tb.millitm) / 10;
  if ((t.tm_sec) & 1) h3 += 100;
  h1 = establecerBits(h1, 0, 5, t.tm_sec / 2);
  h1 = establecerBits(h1, 5, 6, t.tm_min);
  h1 = establecerBits(h1, 11, 5, t.tm_hour);
  h2 = establecerBits(h2, 0, 5, t.tm_mday);
  h2 = establecerBits(h2, 5, 4, t.tm_mon);
  h2 = establecerBits(h2, 9, 7, t.tm_year - 80);
  entrada[13] = h3;
  fb_convertir_a_little_endian(entrada + 14, h1, 16);
  fb_convertir_a_little_endian(entrada + 16, h2, 16);
}

void fat32aop_insertar_datos_nombre_largo_en_entrada (unsigned short int * nombre, char * entrada) {
  unsigned char posicion;
  unsigned char posEntrada;
  unsigned char estado = 1;
  unsigned short int numCaracter;
  for (posicion = 0; posicion < 13; posicion ++) {
    if (estado) numCaracter = entrada[posicion]; else numCaracter = 65535;
    if (!numCaracter) estado = 0;
    posEntrada = 2 * posicion + 1;
    if (posicion >= 5) posEntrada += 3;
    if (posicion >= 11) posEntrada += 2;
    fat32_convertir_a_little_endian(entrada + posEntrada, numCaracter, 16);
  }
}

#endif